package com.fdb.efp.nls.service.impl.dw;

import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.efp.nls.common.constant.BdLoanConstant;
import com.fdb.efp.nls.service.domain.TxtFileLoadBean;
import com.fdb.efp.nls.service.domain.dw.DwBaiduRepayItemBean;
import com.fdb.efp.nls.service.facade.dw.DwRepayDetailBatchService;
import com.fdb.efp.nls.service.util.DueDataUtil;
import com.fdb.efp.nls.service.util.SDicMappingUtil;
import com.fdb.efp.nls.service.util.TxtFileLoadPluginBatch;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.facade.BdRepayDetailService;
import com.fdb.efp.nls.service.facade.DwBaiduRepayItemTempService;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.vo.BdRepayDetailVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据存量的贷款每日还款信息明细临时表数据修改还款明细表
 * 
 * @author ludayong
 * @since 2019年5月13日 上午9:46:03
 * @version 1.0
 */
@Service("dwRepayDetailBatchService")
public class DwRepayDetailBatchServiceImpl implements DwRepayDetailBatchService {

	private static Logger logger = LoggerFactory.getLogger(DwRepayDetailBatchServiceImpl.class);

	@Autowired
	@Qualifier("dwBaiduRepayItemTempService")
	private DwBaiduRepayItemTempService dwBaiduRepayItemTempService;// 贷款每日还款信息明细临时信息

	@Autowired
	@Qualifier("bdRepayDetailService")
	private BdRepayDetailService bdRepayDetailService;// 还款明细分期信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	// /**
	// *
	// * 根据存量的贷款每日还款信息明细文件临时表数据修改还款明细表<br>
	// * 0.1:ludayong:2019年5月13日 上午9:09:53:新增 <br>
	// *
	// * @author ludayong
	// * @since 2019年5月13日 上午9:09:53
	// * @date 2019年5月13日 上午9:09:53
	// * @version 0.1
	// */
	// @Override
	// public boolean batchSyncRepayDetail(String fileUrl) throws Exception {
	// boolean result = false;
	// long startTime = System.currentTimeMillis();
	// logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表：[" + DateTool.formatDate(new
	// Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
	// // 可以配置参数
	// Integer pageSize = 1000;
	// try {
	// // 需要新增或者修改的还款明细分期信息
	// List<BdRepayDetailVO> list = null;
	// // 分页信息
	// DwBaiduRepayItemTempVO pageInfo = new DwBaiduRepayItemTempVO();
	// // 新增或者修改的还款明细分期信息数量
	// int num = 0;
	// // 页数
	// int page = 1;
	// // pageSize初始化
	// if (pageSize > 0) {
	// pageInfo.setSize(pageSize);
	// } else {
	// pageInfo.setSize(1000);
	// }
	// // 判断循环次数
	// int size = dwBaiduRepayItemTempService.queryCount();
	// String size_msg = "【贷款每日还款信息明细表】数据量：" + size;
	// logger.info(size_msg, "message{}");
	// int loopCount = (size / pageInfo.getSize()) + 1;
	//
	// for (int i = 0; i < loopCount; i++) {
	// String page_msg = "【贷款每日还款信息明细表】当前页数：" + pageInfo.getPage() + "，分页大小：" +
	// pageInfo.getSize();
	// logger.info(page_msg, "message{}");
	// // 分页查询【贷款每日还款信息明细表】数据
	// List<DwBaiduRepayItemTempVO> tempList =
	// dwBaiduRepayItemTempService.queryByPage(pageInfo);
	// // 初始化增或者修改的还款明细分期信息
	// list = new ArrayList<BdRepayDetailVO>();
	//
	// if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
	// try {
	// for (DwBaiduRepayItemTempVO dwBaiduRepayItemTempVO : tempList) {
	// // 需要新增或者修改的还款明细分期信息
	// BdRepayDetailVO bdRepayDetailVO =
	// initBdRepayDetailInfo(dwBaiduRepayItemTempVO);
	// // 需要新增或者修改的还款明细分期信息
	// list.add(bdRepayDetailVO);
	// }
	// // 需要新增或者修改的还款明细分期信息
	// if (Objects.nonNull(list) && !list.isEmpty()) {
	// int nlsCreditInfoInsOrUpdNum =
	// bdRepayDetailService.insertOrUpdateBdRepayDetail(list);
	// if (nlsCreditInfoInsOrUpdNum < 1) {
	// throw new BizException("新增或者更新还款明细分期信息表出错，分页页数：" + page);
	// }
	// num += nlsCreditInfoInsOrUpdNum;
	// }
	// } catch (Exception e) {
	// e.printStackTrace();
	// String tableName = "bd_repay_detail";
	// String remark = "初始还款明细分期信息出错，分页页数：" + page;
	// String errorMsg = "初始还款明细分期信息出错，异常信息：" + e.getMessage();
	// logger.error(errorMsg);
	// // 记录异常信息
	// this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// remark);
	// }
	// }
	// pageInfo.setPage(++page);
	// }
	// String num_msg = "【还款明细分期表】插入或更新数据处理结果:" + num;
	// logger.info(num_msg, "message{}");
	// result = true;
	// } catch (
	//
	// Exception e) {
	// e.printStackTrace();
	// String tableName = "bd_repay_detail";
	// String errorMsg = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错";
	// String remark = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错，错误信息：" + e.getMessage();
	// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// remark);
	// logger.error(remark);
	// throw new Exception(remark);
	// }
	// long endTime = System.currentTimeMillis();
	// logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表：[" + DateTool.formatDate(new
	// Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
	// logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表，耗时：[" + (endTime - startTime) /
	// 1000.0 + "]秒，处理结果[" + result + "]");
	// return result;
	// }

	/**
	 * 
	 * 根据存量的贷款每日还款信息明细文件数据修改还款明细表<br>
	 * 0.1:ludayong:2019年5月13日 上午9:09:53:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:09:53
	 * @date 2019年5月13日 上午9:09:53
	 * @version 0.1
	 */
	@Override
	public boolean batchSyncRepayDetail(String fileUrl) throws Exception {
		// 处理结果
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		try {
			TxtFileLoadPluginBatch txtFileLoadPlugin = new TxtFileLoadPluginBatch(fileUrl, "\u0002", "UTF-8", 0, 1000);
			List<TxtFileLoadBean> txtFileLoadList = txtFileLoadPlugin.run(new DwBaiduRepayItemBean());
			result = dueData(txtFileLoadList);
			if (txtFileLoadList.size() != 0) {
				while (!txtFileLoadList.get(txtFileLoadList.size() - 1).isReadedComplete) {
					txtFileLoadPlugin.setFirstRead(false);
					txtFileLoadList = txtFileLoadPlugin.run(new DwBaiduRepayItemBean());
					if (txtFileLoadList.size() == 0) {
						break;
					}
					result = dueData(txtFileLoadList);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_repay_detail";
			String errorMsg = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错";
			String remark = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据存量的贷款每日还款信息明细文件数据加工还款明细信息<br>
	 * 0.1:ludayong:2019年5月13日 上午9:08:10:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月13日 上午9:08:10
	 * @date 2019年5月13日 上午9:08:10
	 * @version 0.1
	 */
	public boolean dueData(List<TxtFileLoadBean> txtFileLoadList) {
		logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表加工处理开始！");
		// 需要新增或者修改的还款明细分期信息
		List<BdRepayDetailVO> list = new ArrayList<BdRepayDetailVO>();
		// 处理结果
		boolean result = false;
		// 新增或者修改的数量
		int num = 0;
		DwBaiduRepayItemBean dwBaiduRepayItemBean = new DwBaiduRepayItemBean();
		try {
			for (int i = 0; i < txtFileLoadList.size(); i++) {
				dwBaiduRepayItemBean = (DwBaiduRepayItemBean) txtFileLoadList.get(i);
				// 需要新增或者修改的还款明细分期信息
				BdRepayDetailVO bdRepayDetailVO = initBdRepayDetailInfo(dwBaiduRepayItemBean);
				if (Objects.nonNull(bdRepayDetailVO)) {
					// 需要新增或者修改的还款明细分期信息
					list.add(bdRepayDetailVO);
				}
			}
			if (list != null && !list.isEmpty()) {
				num = bdRepayDetailService.insertOrUpdateBdRepayDetail(list);
			}
			String num_msg = "【还款明细分期表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			if (num > 0) {
				result = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_repay_detail";
			String errorMsg = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错";
			String remark = "同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			// 清空信息
			list = null;
			txtFileLoadList = null;
		}
		logger.info("同步存量的贷款每日还款信息明细文件临时表数据到还款明细分期表加工处理结束！");
		return result;
	}

	/**
	 * 
	 * 初始化还款明细分期正式表信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public BdRepayDetailVO initBdRepayDetailInfo(DwBaiduRepayItemBean dwBaiduRepayItemBean) {
		BdRepayDetailVO bdRepayDetailVO = new BdRepayDetailVO();
		try {
			// 单位转换
			final int oneHundred = 100;
			// cur_date 账务日期
			bdRepayDetailVO.setCurDate(DueDataUtil.dateInfoTrans(dwBaiduRepayItemBean.getCurDate()));
			// loan_id 借据号
			bdRepayDetailVO.setLoanId(dwBaiduRepayItemBean.getLoanId());
			// tran_date 交易日期
			bdRepayDetailVO.setTranDate(DueDataUtil.dateInfoTrans(dwBaiduRepayItemBean.getTranDate()));
			// tran_time 交易时间
			String tranTime = "";
			try {
				tranTime = DueDataUtil.formatTime6To8(dwBaiduRepayItemBean.getTranTime());
			} catch (Exception e) {
				logger.error("时间转换出现异常，异常信息：" + e.getMessage());
			}
			bdRepayDetailVO.setTranTime(tranTime);
			// seq_no 交易流水号
			bdRepayDetailVO.setSeqNo(dwBaiduRepayItemBean.getSeqNo());
			// term_no 期数
			bdRepayDetailVO.setTermNo(dwBaiduRepayItemBean.getTermNo());
			// event 交易事件
			bdRepayDetailVO.setEvent(dwBaiduRepayItemBean.getEvent());
			// total_amt 交易金额 Number 单位：分
			bdRepayDetailVO.setTotalAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getTotalAmt(), oneHundred));
			// int_reduced_amt_coupon 优惠券抵扣利息金额 Number 单位：分
			bdRepayDetailVO.setIntReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getIntReducedAmt(), oneHundred));
			// pnlt_reduced_amt_coupon 优惠券抵扣罚息金额 Number 单位：分
			bdRepayDetailVO.setPnltReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getPnltReducedAmt(), oneHundred));
			// fund_fee_reduced_amt_coupon 优惠券抵扣借款服务费金额 Number 单位：分
			bdRepayDetailVO
					.setFundFeeReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getFundFeeReducedAmt(), oneHundred));
			// income_amt 实收金额 Number 单位：分
			bdRepayDetailVO.setIncomeAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getIncomeAmt(), oneHundred));
			// prin_amt 本金发生额 Number 单位：分
			bdRepayDetailVO.setPrinAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getPrinAmt(), oneHundred));
			// int_amt 利息发生额 Number 单位：分
			bdRepayDetailVO.setIntAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getIntAmt(), oneHundred));
			// pnlt_int_amt 罚息发生额 Number 单位：分
			bdRepayDetailVO.setPnltIntAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getPnltIntAmt(), oneHundred));
			// fund_fee_amt 借款服务费发生额 Number 单位：分
			bdRepayDetailVO.setFundFeeAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getFundFeeAmt(), oneHundred));
			// partner_loan_id 机构贷款标识号
			bdRepayDetailVO.setPartnerLoanId(dwBaiduRepayItemBean.getPartnerLoanId());
			// charges_reduced_amt_coupon 优惠券抵扣分期手续费 Number 单位：分
			bdRepayDetailVO
					.setChargesReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getChargesReducedAmt(), oneHundred));
			// overdue_reduced_amt_coupon 优惠券抵扣逾期费 Number 单位：分
			bdRepayDetailVO
					.setOverdueReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getOverdueReducedAmt(), oneHundred));
			// repay_violate_reduced_amt_coupon 优惠券抵扣提前还款违约金 Number 单位：分
			bdRepayDetailVO.setRepayViolateReducedAmtCoupon(
					DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getRepayViolateReducedAmt(), oneHundred));
			// refund_violate_reduced_amt_coupon 优惠券抵扣退款违约金 Number 单位：分
			bdRepayDetailVO.setRefundViolateReducedAmtCoupon(
					DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getRefundViolateReducedAmt(), oneHundred));
			// service_reduced_amt_coupon 优惠券抵扣担保费 Number 单位：分
			bdRepayDetailVO
					.setServiceReducedAmtCoupon(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getServiceReducedAmt(), oneHundred));
			// charges_amt 分期手续费发生额 Number 单位：分
			bdRepayDetailVO.setChargesAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getChargesAmt(), oneHundred));
			// overdue_amt 逾期费发生额 Number 单位：分
			bdRepayDetailVO.setOverdueAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getOverdueAmt(), oneHundred));
			// repay_violate_amt 提前还款违约金发生额 Number 单位：分
			bdRepayDetailVO.setRepayViolateAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getRepayViolateAmt(), oneHundred));
			// refund_violate_amt 退款违约金发生额 Number 单位：分
			bdRepayDetailVO.setRefundViolateAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getRefundViolateAmt(), oneHundred));
			// service_amt 担保费发生额 Number 单位：分
			bdRepayDetailVO.setServiceAmt(DueDataUtil.checkDecimalInfo(dwBaiduRepayItemBean.getServiceAmt(), oneHundred));
			// prd_code 产品代码
			bdRepayDetailVO.setPrdCode(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, dwBaiduRepayItemBean.getProdtp()));
			// create_time 创建时间
			bdRepayDetailVO.setCreateTime(DueDataUtil.getCreateTimeValue(dwBaiduRepayItemBean.getEtlDate()));
			// last_modify_time 最近修改时间
			bdRepayDetailVO.setLastModifyTime(DateTool.getCurrentDateTime());
			return bdRepayDetailVO;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_repay_detail";
			String remark = "初始还款明细分期信息出错，借据号：" + dwBaiduRepayItemBean.getLoanId();
			String errorMsg = "初始还款明细分期信息出错，异常信息：" + e.getMessage();
			logger.error(errorMsg);
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			return null;
		}
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
